<?php

/**
 * Интерфейс взаимодействия с социальными сетями.
 * - Авторизация пользователя через социальные сети;
 *
 * @author Andriy
 */
class Social
{

    /**
     * Массив социальных сервисов.
     * 
     * @var array
     */
    protected $_services = array();

    /**
     * Url для перенаправления после авторизации.
     *
     * @var string
     */
    protected $_redirect_url = '';

    /**
     * Тип сервиса выбраный пользователем
     *
     * @var string
     */
    protected $_service_type = null;

    /**
     * Инициализация сервисов.
     * Передаются общие параметры в сервисы из массива $_services.
     *
     * @return Social 
     */
    public function init()
    {
        foreach( $this->_services as $type => $service )
        {
            $this->_services[$type]->setRedirectUrl( $this->_redirect_url );
        }
        
        return $this;
    }

    /**
     * Слушает запрос для вибора сервиса.
     * Если в $request придет параметр по имени social_type - тип сервиса.
     * Если тип сервиса добавлен в массив сервисов то этот сервис будет инициализирован.
     *
     * @param array $request
     * @return boolean
     */
    public function listenService( $request )
    {

        if( !isset( $request['social_type'] ) )
        {
            return false;
        }

        $socauth_type = $request['social_type'];

        if( !isset( $this->_services[$socauth_type] ) )
        {
            return false;
        }

        $this->_service_type = $socauth_type;
        $this->_services[$socauth_type]->init();

        return true;
    }

    /**
     * Добавляет сервис в масив сервисов
     *
     * @param SocAuth_Interface $service
     * @return Social 
     */
    public function addService( Social_Interface $service )
    {
        $this->_services[ $service->getType() ] = $service;

        return $this;
    }

    /**
     * Возвращает JavaScript со слушателями кнопок сервисов.
     * 
     * @return string
     */
    public function getButtonsHandler()
    {
        $script = '<script type="text/javascript">';

        foreach( $this->_services as $service )
        {
            $script .= $service->getScriptLoginHandler();
        }

        $script .= '</script>';
        
        return $script;
    }

    /**
     * Возвращает идентификатор пользователя вибраного сервиса.
     *
     * @return int | boolean
     */
    public function getUserId()
    {
        if( !$this->_service_type )
        {
            return false;
        }
        return $this->_services[$this->_service_type]->getUserId();
    }

    /**
     * Возвращает данные пользователя по идентификатору.
     *
     * @param int $user_id
     * @return array
     */
    public function getUserInfo( $user_id )
    {
        if( !$this->_service_type  )
        {
            return false;
        }
        return $this->_services[$this->_service_type]->getUserInfo( $user_id );
    }

    /**
     * Устанавливает Url на который будет 
     * перенаправлен пользователь после авторизации.
     *
     * @param string $url
     */
    public function setRedirectUrl( $url )
    {
        $this->_redirect_url = $url;
    }

    /**
     * Возвращает Url перенаправления пользователя.
     *
     * @return string
     */
    public function getRedirectUrl()
    {
        return $this->_redirect_url;
    }

    /**
     * Возвращает скрипт для закрытия окна авторизации.
     *
     * @return string 
     */
    public function getCloseScript()
    {
        $script = '
            <script type="text/javascript">
                window.opener.location.href = window.opener.location.href;
                window.close();
            </script>

        ';
        return $script;
    }

}
?>
